<--- %%NOBANNER%% --> _ranbin.sas
 BackForward

/*-------------------<-- Start of Description -->--------------------\
| Generate random variate from a binomial distribution               |
|--------------------<--- End of Description -->---------------------|
|--------------------------------------------------------------------|
|--------------<--- Start of Files or Arguments Needed -->-----------|
| Arguments Need:                                                    |
|      seed - seed; Required, default is the current system time;    |
|      var  - the variable to save the generated random variates;    |
|      n    - the sample size;                                       |
|      p    - the sample proportion;                                 |
|      temp - the temporary variable to update the seed;             |
|             default is _ranbin0_;                                  |
|---------------<--- End of Files or Arguments Needed -->------------|
|--------------------------------------------------------------------|
|----------------<--- Start of Example and Usage -->-----------------|
|Example                                                             |
|   data one;                                                        |
|      do i=1 to 20;                                                 |
|      x=%_ranbin(n=10, p=0.5);                                      |
|      %_ranbin(seed=12345,var=y, n=20, p=0.5);                      |
|      output;                                                       |
|      end;                                                          |
|   run; %print(one);                                                |
|Usage: %_ranbin(seed=%sysfunc(datetime(), 15.), var=, n=REQUIRED,   | 
|                p=REQUIRED, temp=_ranbin0_);                        |
\-------------------<--- End of Example and Usage -->---------------*/
%macro _ranbin(seed=%sysfunc(datetime(), 15.), var=, n=REQUIRED,     
               p=REQUIRED, temp=_ranbin0_);
/*--------------------------------------------\
| Author:  Duo Zhou;                          |
| Created: 3-22-2002 6:30pm;                  |
| Purpose: Random Binomial Generator;         |
\--------------------------------------------*/
%let _sizechk_=%sysfunc(rxmatch(%sysfunc(rxparse(.|$a|$A|$w)),&n)); 
%let _propchk_=%sysfunc(rxmatch(%sysfunc(rxparse($a|$A|$w)),&p));
%if (%quote(&seed) eq) or &_sizechk_ or &_propchk_ %then %do; %put &_sizechk_;
   %if (%quote(&seed) eq) %then %do;
      %put ==> Error: This is not a valid seed!; 
      %if (%length(&var)) %then %do; &var=.; %end;
      %else %do; .;%end;
   %end;
   %if &_sizechk_ %then %do;
      %put ==> Error: &n is not a valid sample size!; 
      %if (%length(&var)) %then %do; &var=.; %end;
      %else %do; .;%end;
   %end;
   %if &_propchk_ %then %do;
      %put ==> Error: &p is not a valid proportion!; 
      %if (%length(&var)) %then %do; &var=.; %end;
      %else %do; .;%end;
   %end;
   %goto finish;
%end;
%else %if (&n le 1) or (&p ge 1) or (&p le 0) %then %do;
   %if (&n le 1) %then %do;
      %put ==> Error: the sample size must be greater than 1!; 
      %if (%length(&var)) %then %do; &var=.; %end;
      %else %do; .;%end;
   %end;
   %if (&p ge 1) or (&p le 0) %then %do;
      %put ==> Error: the proportion must be greater than 0 and less than 1!; 
      %if (%length(&var)) %then %do; &var=.; %end;
      %else %do; .;%end;
   %end;
   %goto finish;
%end;
%else %do;
   %if (%length(&var)) %then %do;
      %if (not %sysfunc(rxmatch(%sysfunc(rxparse(_|.|$a|$A|$w)),&seed))) %then %do;
         drop &temp;
         retain &temp &seed;
         %let seed=&temp;
      %end;
      call ranbin(&seed, &n, &p, &var);
   %end;
   %else ranbin(&seed, &n, &p);
%end;
%finish:
%mend _ranbin;